WEB3 Day2—BlockChain Basic 2 + Solidity基础[part1]

WEB3 Day2—BlockChain Basic 2 + Solidity基础[part1]
SoniaChenWEB3 Day2—BlockChain Basic 2 + Solidity基础[part1]
Layer1
blockChain的base layer,例如bitcoin、BNB chain、Solana,and Avalanche.
Layer2
构建在L1区块链外部但是也与之连接的任何应用application。有各种类型,比如for example ChainLink(去中心化预言机网络) ,以及像The Graph(事件索引网络)。
好的,我将为你优化这段区块链技术描述,提升专业性和清晰度:
Rollup 技术:以太坊Layer2扩容的核心方案
Rollup是Layer2(L2)扩容的主流解决方案,其核心原理是将多笔链下交易打包为一个聚合交易,仅将交易摘要(而非完整数据)提交至以太坊主链(Layer1),大幅提升交易吞吐量并降低Gas费用。根据验证机制不同,Rollup可分为两类:
1. Optimistic Rollups(乐观汇总)
- 工作机制:默认所有链下交易均为有效,运营商(Operator)定期向主链提交状态根(State Root)和交易哈希。若其他参与者发现欺诈交易,可在挑战期(通常7天)内提交欺诈证明(Fraud Proof)进行质疑。
- 安全性:依赖经济惩罚机制(押金锁定)和链上验证合约,若运营商被证明欺诈,将损失押金并回滚状态。
- 代表项目:Arbitrum、Optimism、Base。
2. Zero-Knowledge Rollups(零知识汇总)
- 工作机制:通过零知识证明(ZK Proof)技术生成有效性证明(Validity Proof),证明交易批次的合法性。验证者只需检查证明,无需重放所有交易。
- 核心优势:
- 即时确定性:无需挑战期,交易确认后不可逆转。
- 更高安全性:数学证明保证状态正确性,无需依赖信任假设。
- 更低Gas成本:数据压缩率可达1000:1,验证成本显著低于Optimistic方案。
- 代表项目:zkSync、StarkNet、Polygon zkEVM。
3. 见证(Witness)与零知识证明
- 见证(Witness):是证明者(Prover)生成的一组中间值,用于证明输入数据满足特定数学关系(如哈希函数、椭圆曲线方程)。在ZK Rollups中,Witness包含交易数据、状态转换逻辑等信息,但不泄露具体内容。
- 验证流程:
- 证明者收集交易并生成状态转换。
- 基于Witness生成零知识证明(如SNARK或STARK)。
- 验证者(Verifier)通过智能合约检查证明,确认输出状态与预期一致。
- 技术特性:
- 简洁性:证明大小通常仅几十KB,验证时间极短(毫秒级)。
- 非交互性:单个证明可独立验证,无需与证明者交互。
对比与应用场景
特性 | Optimistic Rollups | ZK Rollups |
---|---|---|
验证机制 | 欺诈证明(默认有效,需挑战) | 有效性证明(数学证明) |
最终确认时间 | 7天挑战期后 | 几秒至几分钟(证明生成后) |
兼容性 | 完全兼容EVM(支持所有Solidity合约) | 部分兼容(需适配ZK-EVM) |
适用场景 | DeFi协议、复杂智能合约 | NFT铸造、高频交易、隐私保护 |
Rollup技术通过链下计算+链上验证的模式,将以太坊的理论TPS从15提升至2000+,Gas成本降低90%以上。Optimistic方案侧重兼容性,ZK方案侧重安全性与效率,两者共同推动区块链应用进入规模化阶段。随着ZK-EVM(如zkSync 2.0)的成熟,未来大多数应用可能转向零知识Rollup架构。
RollUp stage (Rollup 发展阶段)
Stage 0
在这个初始的阶段,RollUp的治理主要由运营方和安全委员会掌控,确保关键决策并且有可信的团体去专门监督(中心化的),此阶段的用户拥有退出机制,可以在七天内离开rollup,但是通常需要实体和运营方的操作进行结合。
Stage 1
中心化的治理演化为智能合约管理,当然安全委员会同时发挥作用。
证明系统完全开始运作,支持去中心化的有效证明。
退出机制也得到改进,用户可独立退出而无需运营方协调。
Stage 2
通过完全由智能合约管理的治理机制实现完全去中心化。
无需运营方和安全委员会干预。
证明系统是无许可的,退出机制也完全去中心化。
ZKSync Risk Analysis[风险分析]
https://l2beat.com/scaling/summary L2Beat摘要中可以查看各Rollup所处的stage
Risks那一列的饼图可以体现当前阶段的一些风险,例如ZkSync Era专属页面中:

-
Data Availability: refers to the ability to reconstruct the L2 state from L1 data, ensuring that anyone can verify and rebuild the L2 state if necessary.
能够从L1的数据中重建L2状态
-
State Validation: involves verifying the legitimacy of a set of bundled transactions. For ZK Sync, this is done using zero-knowledge proofs through an algorithm known as PLONK (Permutations over Lagrange-bases for Oecumenical Noninteractive arguments of Knowledge).
涉及验证一组打包交易的合法性。
-
Sequencer Failure: describes the ability to process transactions even if the sequencer is down. In ZK Sync, transactions can still be submitted to L1, though not necessarily enforced immediately.
排序器故障,描述了即使排序器宕机还能够处理交易的能力,这里黄色区块表示,在ZKsync中,交易仍然可以提交到L1,但不一定能够强制执行。
排序器:是负责对打包的用户交易进行排序的操作方(运营商)
The sequencer is the operator responsible for ordering user transactions and often batching them before committing them to Layer 1.
-
Proposer Failure: describes the ability to process transactions even if the proposer is down. In this case, ZK Sync will halt all withdrawals and transactions executions.
提议者宕机但是可以处理交易的能力。在Zksync中回暂停所有的提款和交易执行。
-
Exit Window: In the current ZK Sync stage, there is no window for exit during unwanted upgrades.
红色区块表示Zksync在非预期的升级时不存在退出窗口期。
First Transaction On ZKSync
chainList 官网搜索ZKsync sepolia
https://chainlist.org/?search=zksync+sepolia&testnets=true

进行connect


在zkSync官网的block explorer 中,可搜索到自己的账户,查看交易详情
如何获取测试网络的基金?
📒 NOTE
Network Fauncets
这里可以通过brige桥接源链和目标链来进行,也有两种方式,一种是lock和unlock 另一种是烧毁和铸造;
可能会有安全问题,但是基于ZkSync使用过程的经验来说,是比较安全的。

了解原理之后,我们在推荐的fauncet里获取我们的fund

这里我recive失败了,重新找了其他funsets ,可以用回tenderly试试看
Solidity 基础[part1]
Remix IDE

函数
无返回体函数示例:
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19; // chose our solidity version
contract SimpleStorage {
uint256 public myFavoriteNumber; // 初始值就是0 而且是internal 也就是内部不可见的
function store(uint256 favoriteNumber) public {
myFavoriteNumber = favoriteNumber;
}
}
有返回体示例:
function recive() public view returns (uint256) {
return myFavoriteNumber;
}
数组
// 数组
uint256[] public myFavoriteNumbers;
Person public newPerson = Person(1, 'jack');
Person public myPerson;
function setPerson(string memory name, uint256 person_number) public {
myPersonArray.push(Person(person_number,name));
}
结构
// 结构
struct Person {
uint256 personNumber;
string name;
}
数组加结构
// 数组加结构
Person[] public myPersonArray;
可见性
函数和变量有四种可见性修饰符:
public
:可从合约内部和外部合约访问private
:仅限当前合约内部访问。不会隐藏值,仅限制其访问权限。external
:仅适用于外部的合约访问。⚠️internal
: 当前合约和派生的合约可以访问。
如果没有指定,默认是internal
view 、pure
函数操作权限修饰符
1. view
关键字
-
功能:使用
view
关键字修饰的函数,承诺不会对区块链的状态进行修改。 -
可执行操作
- 能够读取区块链上的数据(也就是状态变量)。
- 可以访问 msg.sender、block.number 等全局变量。
- 支持调用其他同样被标记为
view
或者pure
的函数。
-
不可执行操作:禁止对状态变量进行写入操作。
-
示例:
contract ViewExample {
uint public balance;
// 此函数仅读取状态变量,不会对其进行修改
function getBalance() public view returns (uint) {
return balance;
}
}
2. pure
关键字
-
功能:被
pure
关键字修饰的函数,既不会读取也不会修改区块链的状态。 -
可执行操作
- 可以使用函数内部定义的局部变量。
- 能够操作传入函数的参数。
- 支持进行数学运算。
- 可以调用其他
pure
函数。
-
不可执行操作
- 禁止访问状态变量。
- 不允许调用非
view
或pure
的函数。
-
示例:
contract PureExample {
// 该函数不依赖任何状态变量,仅对输入参数进行计算
function add(uint a, uint b) public pure returns (uint) {
return a + b;
}
}
3. 关键区别
特性 | view 函数 | pure 函数 |
---|---|---|
能否读取状态变量 | 可以 | 不可以 |
能否修改状态变量 | 不可以 | 不可以 |
是否消耗 Gas(外部调用时) | 不消耗 | 不消耗 |
是否消耗 Gas(内部调用时) | 消耗 | 消耗 |
⚠️ 一般调用这两个关键字都不会消耗gas费, 但是如果是内部调用,例如下面这个例子, store里面调用recive就会导致gas费产生。
function store(uint256 favoriteNumber) public {// 存储
myFavoriteNumber = favoriteNumber;
recive(favoriteNumber);
}
function recive() public view returns (uint256) {
return myFavoriteNumber;
}
完整代码:
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19; // stating our version
contract SimpleStorage {
uint256 public myFavoriteNumber; // 初始值就是0 而且是internal 也就是内部不可见的
// 数组
uint256[] public myFavoriteNumbers;
// 结构
struct Person {
uint256 personNumber;
string name;
}
Person public newPerson = Person(1, 'jack');
Person public myPerson;
Person[] public myPersonArray;
function setPerson(string memory name, uint256 person_number) public {
myPerson = Person(person_number, name);
myPersonArray.push(myPerson);
}
function store(uint256 favoriteNumber) public {// 存储
myFavoriteNumber = favoriteNumber;
}
// view 可读不可写 pure 不可读不可写
function recive() public view returns (uint256) {
return myFavoriteNumber;
}
}